package org.db.ui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormat;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.db.Manager;
import org.db.dao.BauwerkslinienDAO;
import org.db.dao.GleisDAO;
import org.db.dao.HoehenlinienDAO;
import org.db.dao.KruemmungslinienDAO;
import org.db.dao.LageskizzenGVPDAO;
import org.db.dao.LageskizzenWeichenDAO;
import org.db.dao.UeberhoehungslinienDAO;
import org.db.dao.query.QueryResult;

/**
 * Klasse zur km- Abfrag
 * @author Lutz
 */
public class AbfragenDialog extends JDialog implements ActionListener, KeyListener {

    /**
	 * 
	 */
	private static final long serialVersionUID = -3327203841333991083L;
	
	private static final String StationException = "Bitte überprüfen Sie die eingegebene Stationierung!" ;
	
	private DecimalFormat format1 = new DecimalFormat("0.000");
	private DecimalFormat format2 = new DecimalFormat("0.00");
	
    public AbfragenDialog() {
        initComponents();
    }

    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jTextFieldS0 = new DoubleTextField();
        jLabel3 = new javax.swing.JLabel();
        jLabelBauwerk = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabelHoehe = new javax.swing.JLabel();
        jLabelElementHoehe = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabelUeberh = new javax.swing.JLabel();
        jLabelElementUeberh = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabelElementKruemmung = new javax.swing.JLabel();
        jButtonStart = new javax.swing.JButton();
        jButtonClose = new javax.swing.JButton();
        jLabelElementKruemmungNext = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabelHoeheBauwerk = new javax.swing.JLabel();
        jLabelBauwBes = new javax.swing.JLabel();
        jLabelGleisAbstand = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        table = new LageskizzenGVPTable(false);
        jLabelWeichenNr = new javax.swing.JLabel();
        jLabelWeichenNr1 = new javax.swing.JLabel();
        jLabelWeichenBez = new javax.swing.JLabel();
        jComboBoxGleis = new javax.swing.JComboBox();
        jLabelBauwerkStationA = new javax.swing.JLabel();
        jLabelBauwerkStationE = new javax.swing.JLabel();
        jLabelUeberhStationA = new javax.swing.JLabel();
        jLabelUeberhStationE = new javax.swing.JLabel();
        jLabelKruemmungStationA = new javax.swing.JLabel();
        jLabelKruemmungStationE = new javax.swing.JLabel();

        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        
        setPreferredSize(new java.awt.Dimension(1200, 700));
        setResizable(false);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18));
        jLabel1.setText("km- Abfrage");

        jLabel2.setFont(new java.awt.Font("Tahoma", 3, 14));
        jLabel2.setText("Stationierung");

        jTextFieldS0.setToolTipText("Eingabe der Stationierung für die die \ngesuchten Elemente angezeigt werden sollen.");
        jTextFieldS0.requestFocusInWindow();

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel3.setText("Bauwerkslinie");
        jLabel3.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        jLabelBauwerk.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelBauwerk.setText("Bauwerk:");

        jLabel4.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel4.setText("Höhenlinie");
        jLabel4.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        jLabelHoehe.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelHoehe.setText("Höhe = ");

        jLabelElementHoehe.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelElementHoehe.setText("Element:");

        jLabel5.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel5.setText("Überhöhungslinie");
        jLabel5.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        jLabelUeberh.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelUeberh.setText("Überhöhung = 0");

        jLabelElementUeberh.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelElementUeberh.setText("Element:");

        jLabel6.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel6.setText("Krümmungslinie");
        jLabel6.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        jLabelElementKruemmung.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelElementKruemmung.setText("Element:");

        jButtonStart.setFont(new java.awt.Font("Tahoma", 1, 12));
        jButtonStart.setText("Abfrage starten");
        jButtonStart.setToolTipText("Startet die Abfrage zur oben eingegebenen Stationierung.");
        jButtonStart.addActionListener(this);
        jButtonStart.addKeyListener(this);

        jButtonClose.setFont(new java.awt.Font("Tahoma", 1, 12));
        jButtonClose.setText("Abfrage beenden");
        jButtonClose.setToolTipText("Beenden der km- Abfrage. Zurück zum Hauptmenü.");
        jButtonClose.addActionListener(this);
        jButtonClose.addKeyListener(this);

        jLabelElementKruemmungNext.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelElementKruemmungNext.setText("");

        jLabel7.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel7.setText("Lageskizze");
        jLabel7.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        jLabelHoeheBauwerk.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelHoeheBauwerk.setText("Höhe Bauwerk:");

        jLabelBauwBes.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelBauwBes.setText("Besonderheiten:");

        jLabelGleisAbstand.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelGleisAbstand.setText("Gleisabstand =");
        
        jScrollPane1.setViewportView(table);

        jLabelWeichenNr.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelWeichenNr.setText("WeichenNr.:");

        jLabelWeichenNr1.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelWeichenNr1.setText("Stationierung:");

        jLabelWeichenBez.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabelWeichenBez.setText("WeichenBez:");

        // Laden der Gleise
        jComboBoxGleis.setFont(new java.awt.Font("Tahoma", 1, 12));
        List<GleisDAO> gleise = Manager.getInstance().getGleisElemente();
        jComboBoxGleis.setModel(new javax.swing.DefaultComboBoxModel((GleisDAO[])gleise.toArray(new GleisDAO[gleise.size()])));
        Manager.getInstance().setCurrentGleis(gleise.get(0));
        jComboBoxGleis.addItemListener(new ItemListener() {
        	
			@Override
			public void itemStateChanged(ItemEvent e) {
				Manager.getInstance().setCurrentGleis((GleisDAO)jComboBoxGleis.getSelectedItem());
				
			}
		});
        
        
        jLabelBauwerkStationA.setFont(new java.awt.Font("Tahoma", 1, 12)); 
        jLabelBauwerkStationA.setText("Stationierung von:");

        jLabelBauwerkStationE.setFont(new java.awt.Font("Tahoma", 1, 12)); 
        jLabelBauwerkStationE.setText("Stationierung bis:");

        jLabelUeberhStationA.setFont(new java.awt.Font("Tahoma", 1, 12)); 
        jLabelUeberhStationA.setText("Stationierung von:");

        jLabelUeberhStationE.setFont(new java.awt.Font("Tahoma", 1, 12)); 
        jLabelUeberhStationE.setText("Stationierung bis:");

        jLabelKruemmungStationA.setFont(new java.awt.Font("Tahoma", 1, 12)); 
        jLabelKruemmungStationA.setText("Stationierung von:");

        jLabelKruemmungStationE.setFont(new java.awt.Font("Tahoma", 1, 12)); 
        jLabelKruemmungStationE.setText("Stationierung bis:");

        JPanel wrapper = new JPanel();
//      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(wrapper);
      wrapper.setLayout(layout);
      getContentPane().add(new JScrollPane(wrapper));
//      getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jComboBoxGleis, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGap(4, 4, 4)
                                .addComponent(jTextFieldS0, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(jButtonStart))))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(19, 19, 19)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabelWeichenNr, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabelWeichenNr1, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabelWeichenBez, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel3))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelBauwerk, javax.swing.GroupLayout.PREFERRED_SIZE, 289, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelBauwerkStationA, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jLabelBauwerkStationE, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelHoeheBauwerk, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelHoehe, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel5))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel4))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelUeberh, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelUeberhStationA, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jLabelUeberhStationE, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel6))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelElementKruemmung, javax.swing.GroupLayout.PREFERRED_SIZE, 334, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelKruemmungStationA, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jLabelKruemmungStationE, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jLabelBauwBes, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabelElementKruemmungNext, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabelElementUeberh, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabelElementHoehe, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 495, Short.MAX_VALUE)))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1130, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel7)
                            .addComponent(jLabelGleisAbstand, javax.swing.GroupLayout.PREFERRED_SIZE, 201, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(319, 319, 319)
                        .addComponent(jButtonClose)))
                .addContainerGap(367, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(23, 23, 23)
                        .addComponent(jComboBoxGleis, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel2)
                            .addComponent(jTextFieldS0, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jButtonStart, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(34, 34, 34)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelBauwerk)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabelBauwerkStationA)
                            .addComponent(jLabelBauwerkStationE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelHoeheBauwerk)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelBauwBes)
                        .addGap(18, 18, 18)
                        .addComponent(jLabel4)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelHoehe)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelElementHoehe)
                        .addGap(18, 18, 18)
                        .addComponent(jLabel5)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelUeberh)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelElementUeberh)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabelUeberhStationA)
                            .addComponent(jLabelUeberhStationE))
                        .addGap(18, 18, 18)
                        .addComponent(jLabel6)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelElementKruemmung)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabelKruemmungStationA)
                            .addComponent(jLabelKruemmungStationE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelElementKruemmungNext)
                        .addGap(18, 18, 18)
                        .addComponent(jLabel7)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelGleisAbstand))
                    .addComponent(jButtonClose, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jLabelWeichenNr)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabelWeichenNr1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabelWeichenBez)
                .addContainerGap(189, Short.MAX_VALUE))
        );

        pack();
    }
    
    public void actionPerformed(ActionEvent e) {
    	if(e.getSource() == jButtonStart){
    		if (isValidInput()) {
    			clearLabel();
        		showResult();
        		saveResult();
    		}    		    		
    	}else if (e.getSource() == jButtonClose) {
    		setVisible(false);
			dispose();
    	}
    }
    /**
     * Prüfen ob s0 innerhalb des Datenbestandes liegt
     * @return
     */
    private boolean isValidInput() {
    	double s0 = jTextFieldS0.getValue();
    	double s1 = Manager.getInstance().getKruemmungslinienElemente().first().getStationierungInMeter();
    	double s2 = Manager.getInstance().getKruemmungslinienElemente().last().getEndstationierungInMeter();
    	if (s0 < s1) {
    		JOptionPane.showMessageDialog(this, StationException,
			        "Stationierung außerhalb des Datenbestandes", JOptionPane.WARNING_MESSAGE);
    		return false;
    	}
    	if (s0 > s2) {
    		JOptionPane.showMessageDialog(this, StationException,
			        "Stationierung außerhalb des Datenbestandes", JOptionPane.WARNING_MESSAGE);
    		return false;
    	}
    	return true;
    }
    /**
     * Speichern der Ergebnisse
     */
    public void saveResult(){
    	//Ergebnisse in .csv und .txt speichern
    	//Speicherpfad analog zum Pfad der gewählten Projektdatei
    }
    
    /**
     * Suche nach Ergenissen zu s0
     */
    public void showResult(){
    	double s0 = jTextFieldS0.getValue();
    	if(s0 != 0){
    		QueryResult result = Manager.getInstance().query(s0);
    		BauwerkslinienDAO bauwerk = result.getNearestBauwerkslinienElement();
    		if(bauwerk != null){
    			if (bauwerk.getStationierungBisInMeter() == bauwerk.getStationierungVonInMeter()) {
    				// Das naheste Bauwerk innerhalb 5m ausgeben
    				if (Math.abs(s0-bauwerk.getStationierungVonInMeter()) <= 5) {
    					jLabelBauwerk.setText("Bauwerk: " + bauwerk.getBauwerk()); 
            		    jLabelBauwerkStationA.setText("Stationierung von: " + format2.format(bauwerk.getStationierungVonInMeter()));
            		    if (bauwerk.getStationierungBisInMeter() == bauwerk.getStationierungVonInMeter()) {
            		    	
            		    } else {
            		    	jLabelBauwerkStationE.setText("Stationierung bis: " + format2.format(bauwerk.getStationierungBisInMeter()));
            		    }  
            		    if (bauwerk.getHoeheInMeter() != 0) {
            		    	jLabelHoeheBauwerk.setText("Höhe: " + bauwerk.getHoeheInMeter());
            		    } else {
            		    	jLabelHoeheBauwerk.setText("Höhe: ");
            		    }        		    
            		    jLabelBauwBes.setText("Besonderheiten: " + bauwerk.getBesonderheiten());    				
    				}
    			} else {
    				if (s0 >= bauwerk.getStationierungVonInMeter()-5 && s0 <= bauwerk.getStationierungBisInMeter()+5) {
    					jLabelBauwerk.setText("Bauwerk: " + bauwerk.getBauwerk()); 
            		    jLabelBauwerkStationA.setText("Stationierung von: " + format2.format(bauwerk.getStationierungVonInMeter()));
            		    jLabelBauwerkStationE.setText("Stationierung bis: " + format2.format(bauwerk.getStationierungBisInMeter()));
            		    if (bauwerk.getHoeheInMeter() != 0) {
            		    	jLabelHoeheBauwerk.setText("Höhe: " + bauwerk.getHoeheInMeter());
            		    } else {
            		    	jLabelHoeheBauwerk.setText("Höhe: ");
            		    }        		    
            		    jLabelBauwBes.setText("Besonderheiten: " + bauwerk.getBesonderheiten());
    				}    				
    			}    			
    		}
    		
    		HoehenlinienDAO hoehenlinienElement = result.getNearestHoehenlinienElement();
    		if(hoehenlinienElement != null){
    			double s = hoehenlinienElement.getStationierungInMeter();
    			double h = hoehenlinienElement.gethoehe();
    			double hoeheBer = 0;
    			double m1 = hoehenlinienElement.getNeigungAn();
    			double m2 = hoehenlinienElement.getNeigungAb();
    			int ra = hoehenlinienElement.getRa() != 0 ? hoehenlinienElement.getRa() : 0;
    			double lt = hoehenlinienElement.getLt() != 0 ? hoehenlinienElement.getLt() : 0;
    			// NW mit Ausrundung
    			if (ra != 0) {
    				// s0 fällt nicht mit NW zusammen
    				if (s0 != s) {
    					// s0 kleiner StationNW, innerhalb der Ausrundung
    					if ((s-lt) < s0 && s0 < s) {
    						if (m2 < m1) {
    							jLabelElementHoehe.setText("Ausrundungsbereich - Kuppe");
    							hoeheBer = (h-(m1*lt)/1000)+((s0-(s-lt))*m1)/1000+((s0-(s-lt))*(s0-(s-lt)))/(2*ra);	
    							jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    						} else {
    							jLabelElementHoehe.setText("Ausrundungsbereich - Wanne");
    							hoeheBer = (h-(m1*lt)/1000)+((s0-(s-lt))*m1)/1000-((s0-(s-lt))*(s0-(s-lt)))/(2*ra);
    							jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    						}  
    						// s0 größer StationNW, innerhalb Ausrundung
    					} else if (s < s0 && (s+lt) > s0) { 
    						if (m2 < m1) {
    							jLabelElementHoehe.setText("Ausrundungsbereich - Kuppe");
    							hoeheBer = (h+(m2*lt)/1000)+((s0-(s-lt))*m2)/1000+(((s+lt)-s0)*((s+lt)-s0))/(2*ra);
    							jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    						} else {
    							jLabelElementHoehe.setText("Ausrundungsbereich - Wanne");
    							hoeheBer = (h+(m2*lt)/1000)+((s0-(s-lt))*m2)/1000-(((s+lt)-s0)*((s+lt)-s0))/(2*ra);
    							jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    						} 
    						// s0 kleiner StationNW, außerhalb der Ausrundung
    					} else if (s0 < (s-lt)) {
    						hoeheBer = h-(m1*(s-s0))/1000;
    						jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    						jLabelElementHoehe.setText("Neigungsbereich");
    						// s0 größer StationNW, außerhalb Ausrundung
    					} else if (s0 > (s+lt)) {
    						hoeheBer = h+(m2*(s0-s))/1000;
    						jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    						jLabelElementHoehe.setText("Neigungsbereich");
    					}
    				} else {
    					if (m2 < m1) {
    						jLabelElementHoehe.setText("Ausrundungsbereich - Kuppe");
    						hoeheBer = h-(lt/ra);
    						jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    					} else {
    						jLabelElementHoehe.setText("Ausrundungsbereich - Wanne");
    						hoeheBer = h+(lt/ra);
    						jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    					}
    				}
    			} else {
					// s0 im Neigungsbereich
    				if (s0 != s) {
    					if (s0 < s) {
    						hoeheBer = h-(m1*(s-s0))/1000;
    						jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    						jLabelElementHoehe.setText("Neigungsbereich");
    					} else {
    						hoeheBer = h+(m2*(s0-s))/1000;
    						jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    						jLabelElementHoehe.setText("Neigungsbereich");
    					}
    				} else {
    					jLabelHoehe.setText("Höhe: " + format1.format(hoeheBer));
    					jLabelElementHoehe.setText("Neigungswechsel");
    				}
    			}
    		}
    		KruemmungslinienDAO kruemmungsElement = result.getNearestKruemmungslinienElement();    		 
    		if (kruemmungsElement != null) {
    			 jLabelKruemmungStationA.setText("Station von: " + format2.format(kruemmungsElement.getStationierungInMeter()));
    			 jLabelKruemmungStationE.setText("Station bis: " + format2.format(kruemmungsElement.getEndstationierungInMeter()));
    			 jLabelElementKruemmung.setText("Element: " + kruemmungsElement.getElement());
    			 if (kruemmungsElement.getRadius() != 0) {
    				 jLabelElementKruemmungNext.setText("Radius: " + kruemmungsElement.getRadius());
    			 } else if (kruemmungsElement.getRp() != 0) {
    				 jLabelElementKruemmungNext.setText("Beta: " + kruemmungsElement.getRp() + "gon");
    			 } else if (kruemmungsElement.getLaengeUeBogen() != 0) {
    				 jLabelElementKruemmungNext.setText(kruemmungsElement.getUebergangsbogen() + " Länge: " + kruemmungsElement.getLaengeUeBogen());
    			 }    			 
    		 }
    		 UeberhoehungslinienDAO ueberhoehungsElement = result.getNearestUeberhoehungslinienElement();
    		 if (ueberhoehungsElement != null) {
    			 UeberhoehungslinienDAO prevUeberhoehungsElement = result.getPrevUeberhoehungslinienElement();
    			 UeberhoehungslinienDAO nextUeberhoehungsElement = result.getNextUeberhoehungslinienElement();
    			 
    			 jLabelUeberhStationA.setText("Station von: " + ueberhoehungsElement.getStationierungInMeterUe());
    			 jLabelUeberhStationE.setText("Station bis: " + ueberhoehungsElement.getEndstationierungInMeterUE());
    			 jLabelUeberh.setText("0");
    			 double sr = ueberhoehungsElement.getStationierungInMeterUe();
    			 int up = 0;
    			 if(prevUeberhoehungsElement.getUeberhoehungInMM() != 0) {
    				  up = prevUeberhoehungsElement.getUeberhoehungInMM();
    			 } 
    			 int un = 0;
    			 if(nextUeberhoehungsElement.getUeberhoehungInMM() != 0) {
    				  un = nextUeberhoehungsElement.getUeberhoehungInMM();
    			 }
    			 double lr = ueberhoehungsElement.getLaengeRampe();
    			 double l2 = nextUeberhoehungsElement.getLaengeRampe();
    			 int uBer = 0;
    			 if (lr != 0) {
    				 if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("RA")) {
    					 jLabelElementUeberh.setText("RA  Länge: " + lr); 
    					 uBer = (int) (((s0-sr)*un)/lr);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("RAs")) {
    					 jLabelElementUeberh.setText("RAs  Länge: " + lr); 
    					 uBer = (int) ((2*(s0-sr)*(s0-sr)*un)/lr);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("RAss")) {
    					 jLabelElementUeberh.setText("RAss  Länge: " + lr); 
    					 uBer = (int) (up-(up/(lr*lr))*(lr-s0)*(lr-s0));
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("REss")) {
    					 jLabelElementUeberh.setText("RAss  Länge: " + lr); 
    					 uBer = (int) (up-(up/(lr*lr))*(lr-s0)*(lr-s0));
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("RAB")) {
    					 jLabelElementUeberh.setText("RAB  Länge: " + lr); 
    					 uBer = (int) (((3*(s0-sr)*(s0-sr))/(lr*lr)-(2*(s0-sr)*(s0-sr)*(s0-sr))/(lr*lr*lr))*un);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("RABs")) {
    					 uBer = (int) (up-(up/(lr*lr))*(lr-s0)*(lr-s0));
    					 uBer = (int) (((3*(s0-sr)*(s0-sr))/(lr*lr)-(2*(s0-sr)*(s0-sr)*(s0-sr))/(lr*lr*lr))*un);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("REBs")) {
    					 uBer = (int) (up-(up/(lr*lr))*(lr-s0)*(lr-s0));
    					 uBer = (int) (((3*(s0-sr)*(s0-sr))/(lr*lr)-(2*(s0-sr)*(s0-sr)*(s0-sr))/(lr*lr*lr))*un);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("RE")) {
    					 jLabelElementUeberh.setText("RE  Länge: " + lr); 
    					 uBer = (int) (up-((s0-sr)*up)/lr);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("REs")) {
    					 jLabelElementUeberh.setText("REs  Länge: " + lr); 
    					 uBer = (int) (up-(2*(s0-sr)*(s0-sr)*up)/lr);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else  if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("REB")) {
    					 jLabelElementUeberh.setText("REB  Länge: " + lr); 
    					 uBer = (int) (up-((3*(s0-sr)*(s0-sr))/(lr*lr)-(2*(s0-sr)*(s0-sr)*(s0-sr))/(lr*lr*lr))*up);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("RE") && 
    						 nextUeberhoehungsElement.getUeberhoehungsrampe().toString().equals("RA")) {
    					 jLabelElementUeberh.setText("Gleisschere RE-RA");
    					 uBer = (int) ((up*(lr+l2))*l2);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 } else if (ueberhoehungsElement.getUeberhoehungsrampe().toString().equals("RA") && 
    						 nextUeberhoehungsElement.getUeberhoehungsrampe().toString().equals("RE")) {
    					 jLabelElementUeberh.setText("Gleisschere RA-RE");
    					 uBer = (int) ((up*(lr+l2))*l2);
    					 jLabelUeberh.setText("Überhöhung: " + uBer);
    				 }
    			 } else if (ueberhoehungsElement.getUeberhoehungInMM() != 0) {
    				 jLabelUeberh.setText("Überhöhung: " + ueberhoehungsElement.getUeberhoehungInMM());
    				 jLabelElementUeberh.setText("Element: konstante Überhöhung"); 
    			 }
    		 }    		
    		 LageskizzenWeichenDAO weiche = result.getNearestWeiche();    		
    		 if (weiche != null) {
    			if (Math.abs(s0-weiche.getstationWeiche()) <= 100) {
    				jLabelWeichenNr.setText("WeichenNr: " + weiche.getnummerWeiche());
        	    	jLabelWeichenNr1.setText("Stationierung: " + weiche.getstationWeiche()); 
        	    	jLabelWeichenBez.setText("WeichenBez: " + weiche.getbezWeiche());        	    	
    			}    			
    		 }    		 
    		 List<LageskizzenGVPDAO> nearestGVPs = result.getNearestGVPs();
    		 table.setLageskizzenGVPs(nearestGVPs);

    		 if (table.getRowCount() > 1) {   
    			 String l1 = (table.getValueAt(0, 7)).toString();
        		 l1 = l1.replace(',', '.');
        		 double dl1 = Double.valueOf(l1);
        		 String l2 = (table.getValueAt(1, 7)).toString();
        		 l2 = l2.replace(',', '.');
        		 double dl2 = Double.valueOf(l2);
        		 String r1 = (table.getValueAt(0, 8)).toString();
        		 r1 = r1.replace(',', '.');
        		 double dr1 = Double.valueOf(r1);
        		 String r2 = (table.getValueAt(1, 8)).toString();
        		 r2 = r2.replace(',', '.');
        		 double dr2 = Double.valueOf(r2);
        		 if (dl1 != 0 && dl2 != 0 && dr1 != 0 && dr2 != 0) {        			 
        			 double s = (dl2-dr2) - (dl1-dr1);
        			 String stationLinks1 = (table.getValueAt(0, 1)).toString();
        			 stationLinks1 = stationLinks1.replace(',', '.');
        			 double sL1 = Double.valueOf(stationLinks1);
        			 String stationLinks2 = (table.getValueAt(1, 1)).toString();
        			 stationLinks2 = stationLinks2.replace(',', '.');
        			 double sL2 = Double.valueOf(stationLinks2);
        			 double a = sL2 - sL1;
        			 double b = s0 - sL1;
        			 double g = (s/a)*b + (dl1-dr1);
            		 jLabelGleisAbstand.setText("Gleisabstand: " + g); 
        		 }        		 
    		 } else if (table.getRowCount() == 1) {
    			 String l1 = (table.getValueAt(0, 7)).toString();
        		 l1 = l1.replace(',', '.');
        		 double dl1 = Double.valueOf(l1);
        		 String r1 = (table.getValueAt(0, 8)).toString();
        		 r1 = r1.replace(',', '.');
        		 double dr1 = Double.valueOf(r1);
    			 double g = dl1 - dr1;
    			 jLabelGleisAbstand.setText("Gleisabstand: " + g); 
    		 }
    	}    	
    }

    // Zurücksetzen der Darstellung für die Ergebnisse
    public void clearLabel() {
    	jLabelBauwerk.setText("Bauwerk:");
    	jLabelBauwerkStationA.setText("Stationierung von: ");
        jLabelBauwerkStationE.setText("Stationierung bis: ");
	    jLabelHoeheBauwerk.setText("Höhe: ");
	    jLabelBauwBes.setText("Besonderheiten: ");
    	jLabelHoehe.setText("Höhe = ");
    	jLabelElementHoehe.setText("Element:");
    	jLabelUeberh.setText("Überhöhung = 0");
    	jLabelWeichenNr.setText("WeichenNr: ");
    	jLabelWeichenNr1.setText("Stationierung: "); 
    	jLabelWeichenBez.setText("WeichenBez: ");
    	jLabelElementHoehe.setText("Element: ");
    	jLabelKruemmungStationA.setText("Station von: ");
    	jLabelKruemmungStationE.setText("Station bis: ");
    	jLabelElementKruemmung.setText("Element: ");
    	jLabelElementKruemmungNext.setText("nächstes Element: ");
    	jLabelUeberhStationA.setText("Station von: ");
       	jLabelUeberhStationE.setText("Station bis: ");
		jLabelElementUeberh.setText("Element: ");
		jLabelGleisAbstand.setText("Gleisabstand: ");
		table.clear();
    }
    private javax.swing.JButton jButtonClose;
    private javax.swing.JButton jButtonStart;
    private javax.swing.JComboBox jComboBoxGleis;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabelBauwBes;
    private javax.swing.JLabel jLabelBauwerk;
    private javax.swing.JLabel jLabelBauwerkStationA;
    private javax.swing.JLabel jLabelBauwerkStationE;
    private javax.swing.JLabel jLabelElementHoehe;
    private javax.swing.JLabel jLabelElementKruemmung;
    private javax.swing.JLabel jLabelElementKruemmungNext;
    private javax.swing.JLabel jLabelElementUeberh;
    private javax.swing.JLabel jLabelGleisAbstand;
    private javax.swing.JLabel jLabelHoehe;
    private javax.swing.JLabel jLabelHoeheBauwerk;
    private javax.swing.JLabel jLabelKruemmungStationA;
    private javax.swing.JLabel jLabelKruemmungStationE;
    private javax.swing.JLabel jLabelUeberh;
    private javax.swing.JLabel jLabelUeberhStationA;
    private javax.swing.JLabel jLabelUeberhStationE;
    private javax.swing.JLabel jLabelWeichenBez;
    private javax.swing.JLabel jLabelWeichenNr;
    private javax.swing.JLabel jLabelWeichenNr1;
    private javax.swing.JScrollPane jScrollPane1;
    private LageskizzenGVPTable table;
    private DoubleTextField jTextFieldS0;

    
	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getSource() == jButtonStart) {
			if(e.getKeyCode() == KeyEvent.VK_ENTER){
				jButtonStart.doClick();
			}
		} else if (e.getSource() == jButtonClose) {
			if(e.getKeyCode() == KeyEvent.VK_ENTER){
				jButtonClose.doClick();
			}
		}
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		
	}

}
